
// 返回的是得分。 初始化时可以设置 KnownMax 为 -INFINITY ， KnownMin 为 INFINITY
int MinMax(int depth, int KnownMax, int KnownMin) {
	if (SideToMove() == Myself)
	    // 如果是我方走子， 获取得分最大的一个。
	    return Max(depth, KnownMin);
	else
	    return Min(depth, KnownMax);
}

int Max(int depth, int KnownMin) {
	int best = -INFINITY;
	// 获取当前局面的得分。
	if (depth <= 0)
	    return Evaluate();
	// 列举所有可能的走法
	GenerateLegalMoves();

	while (hasLegalNext()) {
		MakeNextMove();
		val = Min(depth - 1, best);//将 当前最大值 传递成为 子递归的已知最大值
		UnmakeMove();
		if (val > best) best = val;//得到当前最大值
        if (best >= KnownMin) return KnownMin;//与已知最大值比较，若已知最小值 小于等于 当前最大值，则返回已知最小值。
	}
	return best;
}

int Min(int depth, int KnownMax) {
	int best = INFINITY;
	if (depth <= 0) return Evaluate();
	GenerateLegalMoves();
	while (hasLegalNext()) {
		MakeNextMove();
		val = Max(depth - 1, best);//将 当前最小值 传递成为 子递归的已知最小值
		UnmakeMove();
		if (val < best) best = val;//得到当前最小值
       	if (best <= KnownMax) return KnownMax;//与已知最大值比较，若已知最大值 大于等于 当前最小值，则返回已知最大值
	}
	return best;
}

// ........
